<h1>模型（Models）－ beego ORM</h1>

<p>beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自 Django ORM 和 SQLAlchemy。</p>

<p>目前该框架仍处于开发阶段，可能发生任何导致不兼容的改动。</p>

<p><strong>已支持数据库驱动：</strong></p>

<ul>
    <li>MySQL：<a href="https://github.com/go-sql-driver/mysql">github.com/go-sql-driver/mysql</a><br /></li>
    <li>PostgreSQL：<a href="https://github.com/lib/pq">github.com/lib/pq</a><br /></li>
    <li>Sqlite3：<a href="https://github.com/mattn/go-sqlite3">github.com/mattn/go-sqlite3</a><br /></li>
</ul>

<p>以上数据库驱动均通过基本测试，但我们仍需要您的反馈。</p>

<p><strong>ORM 特性：</strong></p>

<ul>
    <li>支持 Go 的所有类型存储<br /></li>
    <li>轻松上手，采用简单的 CRUD 风格<br /></li>
    <li>自动 Join 关联表<br /></li>
    <li>跨数据库兼容查询<br /></li>
    <li>允许直接使用 SQL 查询／映射<br /></li>
    <li>严格完整的测试保证 ORM 的稳定与健壮<br /></li>
</ul>

<p>更多特性请在文档中自行品读。</p>

<p><strong>安装 ORM：</strong></p>

<pre><code>go get github.com/astaxie/beego/orm
</code></pre>

<h2>修改日志</h2>

<ul>
    <li>2016-01-18: <a href="orm.md#registerdriver">规范了数据库驱动的命名</a><br /></li>
    <li>2014-03-10: <a href="orm.md#getdb">GetDB</a> 从注册的数据库中返回 *sql.DB. <a href="orm.md#resetmodelcache">ResetModelCache</a> 重置已注册的模型struct<br /></li>

    <li><p>2014-02-10: 随着 beego1.1.0 的发布提交的改进</p>

        <ul>
            <li><p>关于 <a href="orm.md#时区设置">时区设置</a></p></li>

            <li><p>新增的 api:<br />
                    Ormer.<a href="object.md#insertmulti">InsertMulti</a><br />
                    Ormer.<a href="object.md#readorcreate">ReadOrCreate</a><br />
                    RawSeter.<a href="rawsql.md#rowstomap">RowsToMap</a><br />
                    RawSeter.<a href="rawsql.md#rowstostruct">RowsToStruct</a><br />
                    orm.<a href="orm.md#newormwithdb">NewOrmWithDB</a></p></li>

            <li><p>改进的 api:<br />
                    RawSeter.<a href="rawsql.md#values">Values</a> 支持设置 columns<br />
                    RawSeter.<a href="rawsql.md#valueslist">ValuesList</a> 支持设置 columns<br />
                    RawSeter.<a href="rawsql.md#valuesflat">ValuesFlat</a> 支持设置 column<br />
                    RawSeter.<a href="rawsql.md#queryrow">QueryRow/QueryRows</a> 从对应每个strcut field位置的赋值，改为对应名称取值（不需要对应好字段数量与位置）</p></li>
        </ul></li>

    <li><p>2013-10-14: <a href="query.md#载入关系字段">自动载入关系字段</a>，<a href="query.md#多对多关系操作">多对多关系操作</a>，完善<a href="query.md#关系查询">关系查询</a></p></li>

    <li><p>2013-10-09: <a href="query.md#update">原子操作更新值</a></p></li>

    <li><p>2013-09-22: <a href="orm.md#registerdatabase">RegisterDataBase</a> maxIdle / maxConn 设置为可选参数, MySQL <a href="models.md#自定义引擎">自定义引擎</a></p></li>

    <li><p>2013-09-16: 支持设置 空闲链接数 和 最大链接数 <a href="orm.md#setmaxidleconns">SetMaxIdleConns</a> / <a href="orm.md#SetMaxOpenConns">SetMaxOpenConns</a></p></li>

    <li><p>2013-09-12: <a href="object.md#read">Read</a> 支持设定条件字段 <a href="object.md#update">Update</a> / <a href="query.md#all">All</a> / <a href="query.md#one">One</a> 支持设定返回字段</p></li>

    <li><p>2013-09-09: Raw SQL <a href="rawsql.md#queryrow">QueryRow/QueryRows</a> 功能完成</p></li>

    <li><p>2013-08-27: <a href="cmd.md#自动建表">自动建表</a>继续改进</p></li>

    <li><p>2013-08-19: <a href="cmd.md#自动建表">自动建表</a>功能完成</p></li>

    <li><p>2013-08-13: 更新数据库类型测试</p></li>

    <li><p>2013-08-13: 增加 Go 类型支持，包括 int8、uint8、byte、rune 等</p></li>

    <li><p>2013-08-13: 增强 date／datetime 的时区支持</p></li>
</ul>

<h2>快速入门</h2>

<h3>简单示例</h3>

<pre lang="go"><code>package main

import (
    &quot;fmt&quot;
    &quot;github.com/astaxie/beego/orm&quot;
    _ &quot;github.com/go-sql-driver/mysql&quot; // import your used driver
)

// Model Struct
type User struct {
    Id   int
    Name string `orm:&quot;size(100)&quot;`
}

func init() {
    // set default database
    orm.RegisterDataBase(&quot;default&quot;, &quot;mysql&quot;, &quot;username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8&quot;, 30)

    // register model
    orm.RegisterModel(new(User))

    // create table
    orm.RunSyncdb(&quot;default&quot;, false, true)
}

func main() {
    o := orm.NewOrm()

    user := User{Name: &quot;slene&quot;}

    // insert
    id, err := o.Insert(&amp;user)
    fmt.Printf(&quot;ID: %d, ERR: %v\n&quot;, id, err)

    // update
    user.Name = &quot;astaxie&quot;
    num, err := o.Update(&amp;user)
    fmt.Printf(&quot;NUM: %d, ERR: %v\n&quot;, num, err)

    // read one
    u := User{Id: user.Id}
    err = o.Read(&amp;u)
    fmt.Printf(&quot;ERR: %v\n&quot;, err)

    // delete
    num, err = o.Delete(&amp;u)
    fmt.Printf(&quot;NUM: %d, ERR: %v\n&quot;, num, err)
}
</code></pre>

<h3>关联查询</h3>

<pre lang="go"><code>type Post struct {
    Id    int    `orm:&quot;auto&quot;`
    Title string `orm:&quot;size(100)&quot;`
    User  *User  `orm:&quot;rel(fk)&quot;`
}

var posts []*Post
qs := o.QueryTable(&quot;post&quot;)
num, err := qs.Filter(&quot;User__Name&quot;, &quot;slene&quot;).All(&amp;posts)
</code></pre>

<h3>SQL 查询</h3>

<p>当您无法使用 ORM 来达到您的需求时，也可以直接使用 SQL 来完成查询／映射操作。</p>

<pre lang="go"><code>var maps []orm.Params
num, err := o.Raw(&quot;SELECT * FROM user&quot;).Values(&amp;maps)
for _,term := range maps{
    fmt.Println(term[&quot;id&quot;],&quot;:&quot;,term[&quot;name&quot;])
}
</code></pre>

<h3>事务处理</h3>

<pre lang="go"><code>o.Begin()
...
user := User{Name: &quot;slene&quot;}
id, err := o.Insert(&amp;user)
if err == nil {
    o.Commit()
} else {
    o.Rollback()
}
</code></pre>

<h3>调试查询日志</h3>

<p>在开发环境下，您可以使用以下指令来开启查询调试模式：</p>

<pre lang="go"><code>func main() {
    orm.Debug = true
...
</code></pre>

<p>开启后将会输出所有查询语句，包括执行、准备、事务等。</p>

<p>例如：</p>

<pre lang="go"><code>[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [    db.Exec /     0.4ms] -   [INSERT INTO `user` (`name`) VALUES (?)] - `slene`
...
</code></pre>